package org.example.Server.Impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.example.Exception.StudentNoExistException;
import org.example.Mapper.EmpExprMapper;
import org.example.Mapper.EmpMapper;
import org.example.Pojo.Emp;
import org.example.Pojo.EmpExpr;
import org.example.Pojo.LoginInfo;
import org.example.Pojo.PageResult;
import org.example.Server.EmpServer;
import org.example.Utils.JwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;

@Service
@Slf4j
public class EmpServerImpl implements EmpServer {

    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExprMapper;

    @Override
    public PageResult getPage(Integer page, Integer pageSize, LocalDate begin, LocalDate end, String name, Integer gander) {
        //Long total=empMapper.count();
        //List<Emp> list =empMapper.selectAll((page-1)*pageSize,pageSize);
        //log.info("<UNK>"+total+"<UNK>");
        //log.info("<UNK>"+list+"<UNK>");
        //return new PageResult(total,list);

        PageHelper.startPage(page, pageSize);
        Page<Emp> p=(Page<Emp>) empMapper.selectAll(name,gander,begin,end);
        return new PageResult(p.getTotal(), p.getResult());
    }


    /*
    * 添加一个员工信息(包含多个员工的工作经历)
    * 添加一个事务管理实现一荣俱荣一损俱损
    * */
    @Transactional
    @Override
    public void add(Emp emp) {
        //添加基础信息
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.add(emp);
        //添加员工的工作经历
        int id = emp.getId();
        List<EmpExpr> empExprList=emp.getExprList();
        if(empExprList!=null&& !empExprList.isEmpty()){
            //为每一个工作经历设置器Id
            for (EmpExpr empExpr : empExprList) {
                empExpr.setEmpId(id);
                //执行mysql语句
                empExprMapper.insertEmpExpr(empExpr);
            }
        }
    }


    /*
    * 批量删除数据通过id
    * */
    @Transactional
    @Override
    public void delete(List<Integer> ids) {
        for (int i = 0; i < ids.size(); i++) {
            empMapper.delete(ids.get(i));
        }
        empExprMapper.delete(ids);
    }


    /*
    * 查询数据通过Id然后放回到前端
    * */
    @Transactional
    @Override
    public Emp getByID(Integer id) {

        //查询其基本信息
        Emp emp=empMapper.getById(id);
        //查询其工作经历
        List<EmpExpr> empExprList=empExprMapper.getById(id);

        emp.setExprList(empExprList);
        return emp;
    }

    @Transactional
    @Override
    public void update(Emp emp) {
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.update(emp);
        //添加员工的工作经历
        int id = emp.getId();
        empExprMapper.delete(List.of(emp.getId()));
        List<EmpExpr> empExprList=emp.getExprList();
        if(empExprList!=null&& !empExprList.isEmpty()){
            //为每一个工作经历设置器Id
            empExprList.forEach(empExpr -> empExpr.setEmpId(id));
            empExprMapper.updateEmpExpr(empExprList);
        }
    }


    /*
    * 更新员工的信息(先删除后添加其信息的形式)
    * */
    @Transactional
    @Override
    public void updateId(Emp emp) {
        List<Integer> ids=new ArrayList<Integer>();
        ids.add(emp.getId());
        LocalDateTime localDateTime=emp.getCreateTime();
        delete(ids);

        //添加基础信息
        emp.setCreateTime(localDateTime);
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.addId(emp);
        //添加员工的工作经历
        int id = emp.getId();
        List<EmpExpr> empExprList=emp.getExprList();
        if(empExprList!=null&& !empExprList.isEmpty()){
            //为每一个工作经历设置器Id
            for (EmpExpr empExpr : empExprList) {
                empExpr.setEmpId(id);
                //执行mysql语句
                empExprMapper.insertEmpExpr(empExpr);
            }
        }
    }

    /*
    * 获取全部的员工
    * */
    @Override
    public List<Emp> getAllEmp() {
        return empMapper.getAllEmp();
    }


    /*
    * 查询UserName和Password对应的用户
    * */
    @Override
    public LoginInfo selectByUserNameAndPassword(Emp emp) throws StudentNoExistException {
        Emp e=empMapper.selectByUserNameAndPassword(emp.getUsername(),emp.getPassword());
        if(e == null){
            throw new StudentNoExistException();
        }else {
            //说明密码正确
            Map<String,Object> map=new HashMap<String,Object>();
            map.put("username",e.getUsername());
            map.put("name",e.getName());
            map.put("id",e.getId());
            String token= JwtUtil.generateToken(map);
            return new LoginInfo(e.getId(),e.getUsername(),e.getName(),token);
        }
    }
}
